import request from "@/utils/request";
import cache from "@/utils/cache";
import { useCookies } from '@vueuse/integrations/useCookies'

export default {
    namespaced: true,
    state() {
        return {
            user: {
                roleList: [],
                token: "",
                permissionList: []
            },
        }
    },

    mutations: {
        // 同步状态管理
        toggleUser(state, res) {
            state.user = {...res }
            state.token = res.token
        },

        // 清楚状态管理
        clearUser(state) {
            state.user = {}
            state.token = ""
        }
    },

    actions: {
        async logout(context) {
            // 发起异步请求,服务器段会token打入黑名单中
            // 清楚本地缓存
            var cookie = useCookies();
            cookie.remove("pug-admin-token");
            cache.session.remove("token");
            cache.session.remove("nickname");
            cache.session.remove("userId");
            cache.session.remove("vuex");

            // 清楚状态管理
            context.commit("clearUser");
            // 清楚状态管理的菜单。跨模块清除 在vuex状态管理的根目录找到菜单menu状态管理模块的方法clearMenu进行清楚
            context.commit('menu/clearMenu', null, { root: true });
            // 执行异步请求去
            await request.post("/auth/logout");
            // 如果执行成功，把本地的session缓存和状态全部清楚
            // 退出执行逻辑
            return Promise.resolve(true);
        },

        // 登录逻辑
        async logined(context, logininfo) {
            try {
                // 1: 异步执行. res就是服务器请求的信息
                const res = await request.post("/auth/login/pwd", logininfo);
                // 2：如果请求成功就是200
                if (res.status == 200) {
                    var cookie = useCookies();
                    // 3: 获取服务器段返回的数据信息
                    const { token, userId, nickname } = res.data;
                    // 4: 把服务器段信息放入到session中
                    cache.session.set("token", token);
                    cache.session.set("nickname", nickname);
                    cache.session.set("userId", userId);
                    cookie.set("pug-admin-token", token);
                    // 状态管理  res.data 是服务端返回的所有的用户信息，包括角色列表和权限列表
                    context.commit("toggleUser", res.data);
                    // 为什么返回承诺promise,
                    return Promise.resolve(res.data);
                } else {
                    return Promise.reject(res);
                }
            } catch (err) {
                return Promise.reject(err);
            }
        }
    },

    // 数据加工在再造处理
    getters: {
        // 判断是否登录
        isLogin: state => {
            return state.token || false;
        },

        // 角色列表
        rolename: state => {
            return state.user.roleList.map(role => role.name).join(",")
        },

        // 角色列表ids
        roleids: state => {
            return state.user.roleList.map(role => role.id).join(",")
        },

        // 权限列表
        permissons: state => {
            return state.user.permissionList.map(per => ({ id: per.id, code: per.code, url: per.url }));
        }
    }
}